%% Generate B1I ranging code
function code = b1iCodeGen(PRNs)
%% 相位分配表����
phase = {   [ 1, 3],[ 1, 4],[ 1, 5],[ 1, 6],[ 1, 8],[ 1, 9],[ 1,10],...
    [ 1,11],[ 2, 7],[ 3, 4],[ 3, 5],[ 3, 6],[ 3, 8],[ 3, 9],[ 3,10],...
    [ 3,11],[ 4, 5],[ 4, 6],[ 4, 8],[ 4, 9],[ 4,10],[ 4,11],[ 5, 6],...
    [ 5, 8],[ 5, 9],[ 5,10],[ 5,11],[ 6, 8],[ 6, 9],[ 6,10],...
    [ 6,11],[ 8, 9],[ 8,10],[ 8,11],[ 9,10],[ 9,11],[10,11],...
    [ 1, 2, 7],[ 1, 3, 4],[ 1, 3, 6],[ 1, 3, 8],[ 1, 3,10],...
    [ 1, 3,11],[ 1, 4, 5],[ 1, 4, 9],[ 1, 5, 6],[ 1, 5, 8],...
    [ 1, 5,10],[ 1, 5,11],[ 1, 6, 9],[ 1, 8, 9],[ 1, 9,10],...
    [ 1, 9,11],[ 2, 3, 7],[ 2, 5, 7],[ 2, 7, 9],[ 3, 4, 5],...
    [ 3, 4, 9],[ 3, 5, 6],[ 3, 5, 8],[ 3, 5,10],[ 3, 5,11],[3,6,9]};
%% 生成G1 G2
numPRNs = numel(PRNs);
code = false(2046,numPRNs);
for i = 1:numPRNs
    reg1 = logical([0;1;0;1;0;1;0;1;0;1;0]);
    reg2 = logical([0;1;0;1;0;1;0;1;0;1;0]);
    for j = 1:2046
        code(j,i) = arrayXor([reg1(end);reg2(phase{PRNs(i)})]);
        reg1(end) = arrayXor(reg1([1 7 8 9 10 11]));
        reg2(end) = arrayXor(reg2([1 2 3 4 5 8 9 11]));
        reg1    = circshift(reg1,1);
        reg2    = circshift(reg2,1);
    end
end
% [0,1] => [-1, 1]
code = 2*code - 1;
end
%% 异或
function res = arrayXor(X)
res = false;
for ii = 1:numel(X)
    res = xor(res,X(ii));
end
end